package com.bj58.ecdata.monitor.monitor;

/**
 * 数据波动监控
 * @author lichao
 */
public class DataMonitor {
//	private Logger log = LoggerFactory.getLogger(DataMonitor.class);
//	@Autowired
//	private ClickDao click;
//	@Autowired
//	private DisplayDao display;
//	@Autowired
//	private TrackDao track;
//	@Autowired
//	private InfoDao info;
//	private List<BaseDao<?>> daos = Lists.newArrayList();
//	private static int divZero = 99999;
//
//	@PostConstruct
//	public void init() {
//		daos.add(click);
//		daos.add(display);
//		daos.add(track);
//
//		new Thread(new Runnable() {
//			@Override
//			public void run() {
//				while (true) {
//					try {
//						Thread.sleep(DaoConst._1m);
//						process();
//						//房产VPPV监控
////						processFangChanVPPV();
//					} catch (Exception e) {
//						log.error("run DataMonitor process error", e);
//					}
//				}
//			}
//		}).start();
//		
//	}
//
//	/**
//	 * 小时级数据监控，每小时检查一次同环比
//	 */
//	@Scheduled(cron = "15 03 * * * ?")
//	public void monitorHourly() {
//		for (BaseDao<?> dao : daos) {
//			try {
//
//				long curHour = DateUtils.getTruncatedHour() - DaoConst._1h;
//				long yesterdayHour = curHour - DaoConst._1d;
//
//				List<DataPoint> dataPoints = dao.loadHourlyByTime("pv", Lists.newArrayList(yesterdayHour, curHour), false);
//				double yesterdayValue = Double.valueOf(dataPoints.get(0).getValue().toString());
//				double curValue = Double.valueOf(dataPoints.get(1).getValue().toString());
//
//				int momRate = calcRate(curValue, yesterdayValue);
//
//				String dateStr = DateUtils.dateFormat(curHour);
//				String message = String.format("%s 同比：%s, curHour:%s, yesterdayHour:%s at %s", dao.getTableName(), momRate, curValue, yesterdayValue,
//						dateStr);
//				if (momRate == divZero) {
//					log.warn(message);
//				}else if (Math.abs(momRate) > 30) {
//					log.warn(message);
//					SMS.defaultSend(message, 0, 0);
//				} else if (momRate < -15) {
//					log.warn(message);
//					SMS.defaultSend(message, 0, 0);
//				} else {
//					log.info(message);
//				}
//
//			} catch (Exception e) {
//				log.error("run DataMonitor monitorHourly error", e);
//			}
//		}
//	}
//
//	/**
//	 * 分钟级监控，误报率太高
//	 */
//	private void process() {
//		log.info("check pv!");
//		for (BaseDao<?> dao : daos) {
//			long latest = NumberUtils.toLong(dao.getLatestPrimaryDimension());
//			long curMinute = DateUtils.truncateToMinute(latest) - DaoConst._1m;
//			String dateStr = DateUtils.dateFormat(curMinute);
//			long lastMinute = curMinute - DaoConst._1m;
//			List<DataPoint> dataPoints = dao.loadMinuteByTime("pv", Lists.newArrayList(lastMinute, curMinute), false);
//			double lastValue = Double.valueOf(dataPoints.get(0).getValue().toString());
//			double curValue = Double.valueOf(dataPoints.get(1).getValue().toString());
//			int momRate = calcRate(curValue, lastValue);
//
//			String message = String.format("%s 环比：%s, curMinute:%s, lastMinute:%s at %s", dao.getTableName(), momRate, curValue, lastValue,
//					dateStr);
//			
//			if (momRate == divZero) {
//				log.warn(message);
//			} else if (curValue < 1){
//				message = String.format("%s PV：%s, curMinute:%s, lastMinute:%s at %s", dao.getTableName(), curValue, curValue, lastValue,
//						dateStr);
//				log.warn(message);
//				SMS.defaultSend(message, 0, 0);
//			}else if (Math.abs(momRate) > 50) {
//				log.warn(message);
//				SMS.defaultSend(message, 0, 0);
//			} else if (Math.abs(momRate) > 30) {
//				log.warn(message);
//				SMS.defaultSend(message, 0, 0);
//			} else if (momRate < -12) {
//				long todayTime = curMinute;
//				long yesterdayTime = DateUtils.addDays(new Date(todayTime), 0 - 1).getTime();
//				int todayRate = dayRate(dao, todayTime);
//				int yesterdayRate = dayRate(dao, yesterdayTime);
//				message = String.format("%s 环比：%s, curMinute:%s, lastMinute:%s, todayRate:%s, yesterdayRate:%s at %s", dao.getTableName(),
//						momRate, curValue, lastValue, todayRate, yesterdayRate, dateStr);
//				log.warn(message);
//				if (todayRate == divZero || yesterdayRate == divZero) {
//					continue;
//				}
//				int dodRate = Math.abs(todayRate - yesterdayRate);
//				if (dodRate > 20) {
//					SMS.defaultSend(message, 0, 0);
//				} else if (dodRate > 10) {
//					SMS.defaultSend(message, 0, 0);
//				}
//			}
//
//		}
//	}
//
//	/**
//	 * 房产VPPV分钟监控
//	 */
//	@SuppressWarnings("unused")
//	private void processFangChanVPPV(){
//		//13918077259同比下降超过30%就报警
//		long latest = NumberUtils.toLong(track.getLatestPrimaryDimension());
//		//取当前分钟时间，截去秒
//		long curMinute = DateUtils.truncateToMinute(latest)-DaoConst._1m;
//		long lastWeekMinute = curMinute - DaoConst._7d;
//
//		ImmutableMap<String, Object> params = ImmutableMap.of("bussline", (Object)"fangchan");
//		DataPoint curPoint = track.loadMinuteFromMySQLByTime("vppv", curMinute, params, false);
//		DataPoint lastWeekPoint = track.loadMinuteFromMySQLByTime("vppv", lastWeekMinute, params, false);
//		
//		long curValue = Long.valueOf(curPoint.getValue().toString());
//		long lastValue = Long.valueOf(lastWeekPoint.getValue().toString());
//			
//		int momRate = calcRate(curValue, lastValue);
//		String dateStr = DateUtils.dateFormat(curMinute);
//		
//		List<String> receivePhone = Lists.newArrayList("13811583416","13522482231","13581777538","13918077259");
//
//		if (momRate < -40) {
//			String message = String.format("%s fangchan vppv 环比：%s%%, curMinute:%s, lastWeekMinute:%s at %s", track.getTableName(), momRate, curValue, lastValue, dateStr);
//			log.warn(message);
//			SMS.send(receivePhone,message, 0, 0);
//		}
//		log.info("{} 房产环比:{}%, curMinute:{}, lastWeekMinute:{} at {}", track.getTableName(),momRate, curValue, lastValue, dateStr);
//	}
//	
//	
//
//	/**
//	 * 新增信息量小时级监控
//	 */
////	@Scheduled(cron = "00 02 * * * ?")
//	public void processInfoHourly(){
//		try {
//			long latest = NumberUtils.toLong(info.getLatestPrimaryDimension());
//			//取当前时间，截去分钟
//			long curHour = DateUtils.truncateToHour(latest)-DaoConst._1h;
//			long lastWeekHour = curHour - DaoConst._7d;
//	
//			DataPoint curPoint = info.loadHourlyFromMySQLByTime("infoNum", curHour, null, false);
//			DataPoint lastWeekPoint = info.loadHourlyFromMySQLByTime("infoNum", lastWeekHour, null, false);
//			
//			long curValue = Long.valueOf(curPoint.getValue().toString());
//			long lastValue = Long.valueOf(lastWeekPoint.getValue().toString());
//				
//			int momRate = calcRate(curValue, lastValue);
//			String dateStr = DateUtils.dateFormat(latest);
//			
//			List<String> receivePhone = Lists.newArrayList("13811583416","13522482231");
//	
//			if (Math.abs(momRate) > 25) {
//				String message = String.format("%s 新增信息量同比：%s%%, curHour:%s, lastHour:%s at %s", track.getTableName(), momRate, curValue, lastValue, dateStr);
//				log.warn(message);
//				SMS.send(receivePhone,message, 0, 0);
//			}
//			log.info("{} 环比:{}%, curMinute:{}, lastMinute:{} at {}", info.getTableName(),momRate, curValue, lastValue, dateStr);
//		} catch (Exception e) {
//			log.error("run DataMonitor processInfoHourly() error", e);
//		}
//	}
//	
//	private int dayRate(BaseDao<?> dao, long time) {
//		List<Long> times = Lists.newArrayList();
//		for (int i = 9; i >= 0; i--) {
//			times.add(time - (i * DaoConst._1m));
//		}
//		List<DataPoint> points = dao.loadMinuteByTime("pv", times, false);
//		long lastAvg = calcAvg(points.subList(0, 5));
//		long curAvg = calcAvg(points.subList(5, 10));
//		return calcRate(curAvg, lastAvg);
//	}
//
//	private int calcRate(double cur, double last) {
//		if (last == 0)
//			return divZero;
//		double sub = ArithUtil.sub(cur, last);
//		Double rate = ArithUtil.div(sub, last) * 100;
//		return rate.intValue();
//	}
//
//	private long calcAvg(List<DataPoint> list) {
//
//		if (list == null || list.size() == 0) {
//			return 0;
//		}
//
//		long sum = 0;
//		for (DataPoint point : list) {
//
//			sum += Long.parseLong(point.getValue().toString());
//		}
//		return sum / list.size();
//	}

}
